package com.vviton.zyhj.common.utils;

import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringUtils;

/**
 *
 * ClassName: DateUtils <br/>
 * Function: 日期工具类. <br/>
 * Date: 2016年3月10日 下午5:14:27 <br/>
 *
 * @author qiaocf
 * @version 1.0
 * @since JDK 1.7
 */
public abstract class DateUtils {

    /** 日期模板 **/
    public static final String PATTERN_DATE = "yyyy-MM-dd";
    /** 日期模板 **/
    public static final String PATTERN_DATE_DAY = "yyyy-MM-dd 00:00:00";
    /** 日期模板 **/
    public static final String PATTERN_DATE_HOUR = "yyyy-MM-dd HH:00:00";
    /** 日期模板 **/
    public static final String PATTERN_DATETIME = "yyyy-MM-dd HH:mm:ss";
    /** 日期模板 **/
    public static final String PATTERN_DATE_HBASE = "yyyyMMdd";
    /** 日期模板 **/
    public static final String PATTERN_DATETIME_HBASE = "yyyyMMddHHmmssSSS";
    /** 时间模板 **/
    public static final String START_SHORT_TIME = "00:00";
    /** 时间模板 **/
    public static final String END_SHORT_TIME = "23:59";
    /** 时间模板 **/
    public static final String START_LONG_TIME = "00:00:00";
    /** 时间模板 **/
    public static final String END_LONG_TIME = "23:59:59";
    /** 日期模板 **/
    private static String defaultPattern = PATTERN_DATETIME;

    /** 常量 **/
    private static final int NUMBER = 1000;

    /**
     * @Desc 转换成yyyyMMdd日期格式
     * @Author zhangjin
     * @Date 2015年11月24日 下午1:33:58
     * @param date 日期
     * @return String
     */
    public static String formatToSimpleDate(Date date) {
        return new SimpleDateFormat(PATTERN_DATE_HBASE).format(date);
    }

    /**
     * formatToSimpleDateTime,带时分秒的日期格式转换. <br/>
     * Author: yaojie <br/>
     * Create Date: 2016年4月14日 <br/>
     * ===============================================================<br/>
     * Modifier: yaojie <br/>
     * Modify Date: 2016年4月14日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param date 日期
     * @return String 格式化后的日期
     * @since JDK 1.7
     */
    public static String formatToSimpleDateTime(Date date) {
        return new SimpleDateFormat(PATTERN_DATETIME_HBASE).format(date);
    }
    
    /**
     * 
     * parseHbaseTimeToDate,(把hbase格式的时间转换成Date类型的时间). <br/>
     * Author: nifang <br/>
     * Create Date: 2016年6月2日 <br/>
     * ===============================================================<br/>
     * Modifier: nifang <br/>
     * Modify Date: 2016年6月2日 <br/>
     * Modify Description:  <br/>
     * ===============================================================<br/>
     * @param hbaseTime hbase格式的时间
     * @return Date类型的时间
     * @since JDK 1.7
     */
    public static Date parseHbaseTimeToDate(String hbaseTime) {
        SimpleDateFormat format = new SimpleDateFormat(PATTERN_DATETIME_HBASE);
        Date date = null;
        try {
            date = format.parse(hbaseTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     *
     * format,(转换成yyyy-MM-dd HH:mm:ss日期格式). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param date 日期
     * @return String
     * @since JDK 1.7
     */
    public static String format(Date date) {
        return format(date, defaultPattern);
    }

    /**
     *
     * format,(转换成yyyy-MM-dd HH:mm:ss日期格式). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param millis 毫秒数
     * @return String
     * @since JDK 1.7
     */
    public static String format(long millis) {
        return format(millis, defaultPattern);
    }

    /**
     *
     * format,(转换成yyyy-MM-dd HH:mm:ss日期格式). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param calendar 日历类
     * @return String
     * @since JDK 1.7
     */
    public static String format(Calendar calendar) {
        return format(calendar, defaultPattern);
    }

    /**
     *
     * format,(转换成模板的日期格式). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param date 日期
     * @param pattern 模板
     * @return String
     * @since JDK 1.7
     */
    public static String format(Date date, String pattern) {
        if (date != null) {
            SimpleDateFormat formater = new SimpleDateFormat(pattern);
            String result = formater.format(date);
            return result;
        }
        return null;
    }

    /** 当前日期 **/
    private static Date tempDate = new Date();

    /**
     *
     * format,(转换成模板的日期格式). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param millis 毫秒数
     * @param pattern 模板日期
     * @return String
     * @since JDK 1.7
     */
    public static String format(long millis, String pattern) {
        tempDate.setTime(millis);
        SimpleDateFormat formater = new SimpleDateFormat(pattern);
        String result = formater.format(tempDate);
        return result;
    }

    /**
     *
     * currentTimeStamp,(毫秒数). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @return String
     * @since JDK 1.7
     */
    public static String currentTimeStamp() {
        return Integer.toString(new Long(System.currentTimeMillis() / NUMBER).intValue());
    }

    /**
     *
     * format,(转换成模板的日期格式). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param calendar 日历类
     * @param pattern 模板
     * @return String
     * @since JDK 1.7
     */
    public static String format(Calendar calendar, String pattern) {
        if (calendar == null) {
            return null;
        }
        Date date = calendar.getTime();
        SimpleDateFormat formater = new SimpleDateFormat(pattern);
        String result = formater.format(date);
        return result;
    }

    /**
     *
     * parseDate,(转为日期格式). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param strDate string类型的日期
     * @return Date
     * @since JDK 1.7
     */
    public static Date parseDate(String strDate) {
        Date date = null;
        if (StringUtils.isNotEmpty(strDate)) {
            date = parseDate(strDate, defaultPattern);
        }
        return date;
    }

    /**
     *
     * parseDate,(转为模板的日期格式). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param strDate string类型的日期
     * @param pattern 模板
     * @return Date
     * @since JDK 1.7
     */
    public static Date parseDate(String strDate, String pattern) {
        Date result = null;
        try {
            if (StringUtils.isNotEmpty(strDate)) {
                SimpleDateFormat formater = new SimpleDateFormat(pattern);
                result = formater.parse(strDate);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * parseDateWithoutTime,转换不带时分秒格式的时间. <br/>
     * Author: yaojie <br/>
     * Create Date: 2016年4月15日 <br/>
     * ===============================================================<br/>
     * Modifier: yaojie <br/>
     * Modify Date: 2016年4月15日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param strDate 字符串格式时间
     * @return Date 返回Date时间
     * @since JDK 1.7
     */
    public static Date parseDateWithoutTime(String strDate) {
        Date date = null;
        try {
            if (StringUtils.isNotEmpty(strDate)) {
                SimpleDateFormat sdf = new SimpleDateFormat(PATTERN_DATE);
                date = sdf.parse(strDate);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * parseStartDateTime,转换开始时间. <br/>
     * Author: yaojie <br/>
     * Create Date: 2016年4月15日 <br/>
     * ===============================================================<br/>
     * Modifier: yaojie <br/>
     * Modify Date: 2016年4月15日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param strDate
     * @return Date
     * @since JDK 1.7
     */
    public static Date parseStartDateTime(String strDate) {
        Date date = null;
        if (StringUtils.isNotEmpty(strDate) && strDate.length() == 10) {
            date = parseDate(strDate.concat(" " + START_LONG_TIME));
        }
        return date;
    }

    /**
     * parseEndDateTime,转换结束时间. <br/>
     * Author: yaojie <br/>
     * Create Date: 2016年4月15日 <br/>
     * ===============================================================<br/>
     * Modifier: yaojie <br/>
     * Modify Date: 2016年4月15日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param strDate 字符串日期
     * @return Date 时间格式的日期
     * @since JDK 1.7
     */
    public static Date parseEndDateTime(String strDate) {
        Date date = null;
        if (StringUtils.isNotEmpty(strDate) && strDate.length() == 10) {
            date = parseDate(strDate.concat(" " + END_LONG_TIME));
        }
        return date;
    }

    /*-----------------下面所有的compare方法返回1, 0, -1 三种值-----------------*/
    /**
     *
     * compareYear,( 比较年份). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param dateOne 日期一
     * @param dateTwo 日期二
     * @return int
     * @since JDK 1.7
     */
    public static int compareYear(Date dateOne, Date dateTwo) {
        return compareField(dateOne, dateTwo, Calendar.YEAR);
    }

    /**
     *
     * compareYearToMonth,(比较从year到month字段). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param dateOne 日期一
     * @param dateTwo 日期二
     * @return String
     * @since JDK 1.7
     */
    public static int compareYearToMonth(Date dateOne, Date dateTwo) {
        int result = compareField(dateOne, dateTwo, Calendar.YEAR);
        if (result != 0) {
            return result;
        } else {
            return compareField(dateOne, dateTwo, Calendar.MONTH);
        }
    }

    /**
     *
     * compareYearToDay,(比较从year到day字段). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param dateOne 日期一
     * @param dateTwo 日期二
     * @return int
     * @since JDK 1.7
     */
    public static int compareYearToDay(Date dateOne, Date dateTwo) {
        int result = compareField(dateOne, dateTwo, Calendar.YEAR);
        if (result != 0) {
            return result;
        } else {
            return compareField(dateOne, dateTwo, Calendar.DAY_OF_YEAR);
        }
    }

    /**
     *
     * compareYearToHour,(比较从year到hour字段). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param dateOne 日期一
     * @param dateTwo 日期二
     * @return int
     * @since JDK 1.7
     */
    public static int compareYearToHour(Date dateOne, Date dateTwo) {
        int result = compareField(dateOne, dateTwo, Calendar.YEAR);
        if (result != 0) {
            return result;
        } else {
            result = compareField(dateOne, dateTwo, Calendar.DAY_OF_YEAR);
            if (result != 0) {
                return result;
            } else {
                return compareField(dateOne, dateTwo, Calendar.HOUR_OF_DAY);
            }
        }
    }

    /**
     *
     * compareYearToMinutes,(比较从year到minutes字段). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param dateOne 日期一
     * @param dateTwo 日期二
     * @return int
     * @since JDK 1.7
     */
    public static int compareYearToMinutes(Date dateOne, Date dateTwo) {
        int result = compareField(dateOne, dateTwo, Calendar.YEAR);
        if (result != 0) {
            return result;
        }
        result = compareField(dateOne, dateTwo, Calendar.DAY_OF_YEAR);
        if (result != 0) {
            return result;
        }
        result = compareField(dateOne, dateTwo, Calendar.HOUR_OF_DAY);
        if (result != 0) {
            return result;
        }
        return compareField(dateOne, dateTwo, Calendar.MINUTE);
    }

    /**
     *
     * compareYearToSeconds,(比较从year到second字段). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param dateOne 日期一
     * @param dateTwo 日期二
     * @return int
     * @since JDK 1.7
     */
    public static int compareYearToSeconds(Date dateOne, Date dateTwo) {
        int result = compareField(dateOne, dateTwo, Calendar.YEAR);
        if (result != 0) {
            return result;
        }
        result = compareField(dateOne, dateTwo, Calendar.DAY_OF_YEAR);
        if (result != 0) {
            return result;
        }
        result = compareField(dateOne, dateTwo, Calendar.HOUR_OF_DAY);
        if (result != 0) {
            return result;
        }
        result = compareField(dateOne, dateTwo, Calendar.MINUTE);
        if (result != 0) {
            return result;
        }
        return compareField(dateOne, dateTwo, Calendar.SECOND);
    }

    /**
     *
     * compareYearToMillisecond,(比较两个日期是否完全相同). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param dateOne 日期一
     * @param dateTwo 日期二
     * @return int
     * @since JDK 1.7
     */
    public static int compareYearToMillisecond(Date dateOne, Date dateTwo) {
        return compareDate(dateOne, dateTwo);
    }

    /**
     *
     * compareDate,(比较两个日期是否完全相同). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param dateOne 日期一
     * @param dateTwo 日期二
     * @return int
     * @since JDK 1.7
     */
    public static int compareDate(Date dateOne, Date dateTwo) {
        if (dateOne == null) {
            throw new IllegalArgumentException("The dateOne must not be null");
        }
        if (dateTwo == null) {
            throw new IllegalArgumentException("The dateTwo must not be null");
        }
        long result = dateOne.getTime() - dateTwo.getTime();
        if (result > 0) {
            return 1;
        }
        if (result < 0) {
            return -1;
        }
        return 0;
    }

    /**
     *
     * compareMonth,(比较月份). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param dateOne 日期一
     * @param dateTwo 日期二
     * @return int
     * @since JDK 1.7
     */
    public static int compareMonth(Date dateOne, Date dateTwo) {
        return compareField(dateOne, dateTwo, Calendar.MONTH);
    }

    /**
     *
     * compareWeekOfYear,(比较星期数). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param dateOne 日期一
     * @param dateTwo 日期二
     * @return int
     * @since JDK 1.7
     */
    public static int compareWeekOfYear(Date dateOne, Date dateTwo) {
        return compareField(dateOne, dateTwo, Calendar.WEEK_OF_YEAR);
    }

    /**
     *
     * compareWeekOfMonth,(比较某月的第几周). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param dateOne 日期一
     * @param dateTwo 日期二
     * @return int
     * @since JDK 1.7
     */
    public static int compareWeekOfMonth(Date dateOne, Date dateTwo) {
        return compareField(dateOne, dateTwo, Calendar.WEEK_OF_MONTH);
    }

    /**
     *
     * compareDayOfYear,(比较天数). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param dateOne 日期一
     * @param dateTwo 日期二
     * @return int
     * @since JDK 1.7
     */
    public static int compareDayOfYear(Date dateOne, Date dateTwo) {
        return compareField(dateOne, dateTwo, Calendar.DAY_OF_YEAR);
    }

    /**
     *
     * compareDayOfMonth,(比较某月的天数). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param dateOne 日期一
     * @param dateTwo 日期二
     * @return int
     * @since JDK 1.7
     */
    public static int compareDayOfMonth(Date dateOne, Date dateTwo) {
        return compareField(dateOne, dateTwo, Calendar.DAY_OF_MONTH);
    }

    /**
     *
     * compareDayOfWeek,(比较某周的天数). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param dateOne 日期一
     * @param dateTwo 日期二
     * @return int
     * @since JDK 1.7
     */
    public static int compareDayOfWeek(Date dateOne, Date dateTwo) {
        return compareField(dateOne, dateTwo, Calendar.DAY_OF_WEEK);
    }

    /**
     *
     * compareField,(比较的公共方法). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param dateOne 日期一
     * @param dateTwo 日期二
     * @param calendarField 比较的内容
     * @return int
     * @since JDK 1.7
     */
    private static int compareField(Date dateOne, Date dateTwo, int calendarField) {
        if (dateOne == null) {
            throw new IllegalArgumentException("The dateOne must not be null");
        }
        if (dateTwo == null) {
            throw new IllegalArgumentException("The dateTwo must not be null");
        }

        Calendar compareCalendarOne = Calendar.getInstance();
        Calendar compareCalendarTwo = Calendar.getInstance();

        compareCalendarOne.setTime(dateOne);
        compareCalendarTwo.setTime(dateTwo);

        int result = compareCalendarOne.get(calendarField) - compareCalendarTwo.get(calendarField);
        if (result > 0) {
            return 1;
        }
        if (result < 0) {
            return -1;
        }
        return 0;
    }

    // -----------------------------------------------------------------------
    /**
     * Adds a number of years to a date returning a new object. The original
     * date object is unchanged.
     *
     * @param date the date, not null
     * @param amount the amount to add, may be negative
     * @return the new date object with the amount added
     * @throws IllegalArgumentException if the date is null
     */
    public static Date addYears(Date date, int amount) {
        return add(date, Calendar.YEAR, amount);
    }

    // -----------------------------------------------------------------------
    /**
     * Adds a number of months to a date returning a new object. The original
     * date object is unchanged.
     *
     * @param date the date, not null
     * @param amount the amount to add, may be negative
     * @return the new date object with the amount added
     * @throws IllegalArgumentException if the date is null
     */
    public static Date addMonths(Date date, int amount) {
        return add(date, Calendar.MONTH, amount);
    }

    // -----------------------------------------------------------------------
    /**
     * Adds a number of weeks to a date returning a new object. The original
     * date object is unchanged.
     *
     * @param date the date, not null
     * @param amount the amount to add, may be negative
     * @return the new date object with the amount added
     * @throws IllegalArgumentException if the date is null
     */
    public static Date addWeeks(Date date, int amount) {
        return add(date, Calendar.WEEK_OF_YEAR, amount);
    }

    // -----------------------------------------------------------------------
    /**
     * Adds a number of days to a date returning a new object. The original date
     * object is unchanged.
     *
     * @param date the date, not null
     * @param amount the amount to add, may be negative
     * @return the new date object with the amount added
     * @throws IllegalArgumentException if the date is null
     */
    public static Date addDays(Date date, int amount) {
        return add(date, Calendar.DAY_OF_MONTH, amount);
    }

    // -----------------------------------------------------------------------
    /**
     * Adds a number of hours to a date returning a new object. The original
     * date object is unchanged.
     *
     * @param date the date, not null
     * @param amount the amount to add, may be negative
     * @return the new date object with the amount added
     * @throws IllegalArgumentException if the date is null
     */
    public static Date addHours(Date date, int amount) {
        return add(date, Calendar.HOUR_OF_DAY, amount);
    }

    // -----------------------------------------------------------------------
    /**
     * Adds a number of minutes to a date returning a new object. The original
     * date object is unchanged.
     *
     * @param date the date, not null
     * @param amount the amount to add, may be negative
     * @return the new date object with the amount added
     * @throws IllegalArgumentException if the date is null
     */
    public static Date addMinutes(Date date, int amount) {
        return add(date, Calendar.MINUTE, amount);
    }

    // -----------------------------------------------------------------------
    /**
     * Adds a number of seconds to a date returning a new object. The original
     * date object is unchanged.
     *
     * @param date the date, not null
     * @param amount the amount to add, may be negative
     * @return the new date object with the amount added
     * @throws IllegalArgumentException if the date is null
     */
    public static Date addSeconds(Date date, int amount) {
        return add(date, Calendar.SECOND, amount);
    }

    // -----------------------------------------------------------------------
    /**
     * Adds a number of milliseconds to a date returning a new object. The
     * original date object is unchanged.
     *
     * @param date the date, not null
     * @param amount the amount to add, may be negative
     * @return the new date object with the amount added
     * @throws IllegalArgumentException if the date is null
     */
    public static Date addMilliseconds(Date date, int amount) {
        return add(date, Calendar.MILLISECOND, amount);
    }

    /**
     *
     * add,(增加某天). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param date 日期
     * @param calendarField 增加的内容
     * @param amount 数目
     * @return Date
     * @since JDK 1.7
     */
    private static Date add(Date date, int calendarField, int amount) {
        if (date == null) {
            throw new IllegalArgumentException("The date must not be null");
        }
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(calendarField, amount);
        return c.getTime();
    }

    /**
     * 把yyyy-MM-dd hh:mm:ss格式的日期字符串转换成 sql.Timestamp 类型 by wx
     *
     * @param str 字符串
     * @return parseTimestampString
     */
    public static java.sql.Timestamp parseTimestampString(String str) {
        java.sql.Timestamp timestamp = null;
        try {
            if (str != null && !str.equals("") && !str.equals(" ")) {
                timestamp = new java.sql.Timestamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", java.util.Locale.US).parse(str).getTime());
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return timestamp;
    }

    /**
     * 字符串转时间戳
     *
     * @param strDate 时间
     * @param Format 格式 如 yyyy-MM-dd HH:mm:ss
     * @return int 时间戳 秒
     * @throws ParseException 异常
     */
    public static int strToNum(String strDate, String Format) {
        SimpleDateFormat datetimeFormat = new SimpleDateFormat(Format, java.util.Locale.US);
        Date strToDate = null;
        int second = 0;
        try {
            strToDate = datetimeFormat.parse(strDate);
            long timeStemp = strToDate.getTime();
            second = (int) (timeStemp / NUMBER);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return second;
    }

    /**
     * 获取日期所在季度的开始时间
     *
     * @param date 字符串
     * @return String
     */
    public static String getQuarterStartTime(String date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar c = Calendar.getInstance();
        int currentMonth = Integer.parseInt(StringUtils.substringBetween(date, "-"));
        System.out.println(currentMonth);
        String now = null;
        try {
            Date dateTime = sdf.parse(date);
            c.setTime(dateTime);
            if (currentMonth >= 1 && currentMonth <= 3) {
                c.set(Calendar.MONTH, 0);
            } else if (currentMonth >= 4 && currentMonth <= 6) {
                c.set(Calendar.MONTH, 2);
            } else if (currentMonth >= 7 && currentMonth <= 9) {
                c.set(Calendar.MONTH, 6);
            } else if (currentMonth >= 10 && currentMonth <= 12) {
                c.set(Calendar.MONTH, 9);
            }
            c.set(Calendar.DATE, 1);
            now = sdf.format(c.getTime());
        } catch (Exception e) {
            e.printStackTrace();
        }

        return now;
    }

    /**
     * 当获取日期所在季度的结束时间
     *
     * @param date 字符串
     * @return String
     */
    public static String getQuarterEndTime(String date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar c = Calendar.getInstance();
        int currentMonth = Integer.parseInt(StringUtils.substringBetween(date, "-"));
        String now = null;
        try {
            Date dateTime = sdf.parse(date);
            c.setTime(dateTime);
            if (currentMonth >= 1 && currentMonth <= 3) {
                c.set(Calendar.MONTH, 2);
                c.set(Calendar.DATE, 31);
            } else if (currentMonth >= 4 && currentMonth <= 6) {
                c.set(Calendar.MONTH, 5);
                c.set(Calendar.DATE, 30);
            } else if (currentMonth >= 7 && currentMonth <= 9) {
                c.set(Calendar.MONTH, 8);
                c.set(Calendar.DATE, 30);
            } else if (currentMonth >= 10 && currentMonth <= 12) {
                c.set(Calendar.MONTH, 11);
                c.set(Calendar.DATE, 31);
            }

            now = sdf.format(c.getTime());
        } catch (Exception e) {
            e.printStackTrace();
        }

        return now;
    }

    /**
     * 获得距离最近多少天的日期
     *
     * @param days 天数， 如果是当前日期之前，则传递负数，如-1，如果是当前日期之后，请传递正数，如1
     * @author binbin
     * @return 返回日期字符串
     */
    @SuppressWarnings("static-access")
    public static String getLatestDateDay(int days) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        cal.add(cal.DATE, days);
        Date date = cal.getTime();
        return format(date, PATTERN_DATE_DAY);
    }

    /**
     * 
     * getLatestDateYear,(获得距离最近多少年的日期). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年5月4日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年5月4日 <br/>
     * Modify Description:  <br/>
     * ===============================================================<br/>
     * @param year 年数  如果是当前日期之前，则传递负数
     * @return Date 日期
     * @since JDK 1.7
     */
    public static Date getLatestDateYear(int year) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        cal.add(Calendar.YEAR, year);
        cal.set(Calendar.HOUR_OF_DAY,0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        Date date = cal.getTime();
        return date;
    }

    /**
     * 获得距离最近多少小时的时刻，格式 yyyy-MM-dd HH:00:00
     *
     * @param hours 小时数， 如果是当前时间之前，则传递负数，如-1，如果是当前时间之后，请传递正数，如1
     * @author binbin
     * @return String
     */
    @SuppressWarnings("static-access")
    public static String getFullLatestDateHour(int hours) {

        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        cal.add(cal.HOUR, hours);

        return format(cal.getTime(), PATTERN_DATE_HOUR);
    }

    /**
     * 获取距离最近多少小时前的特点时刻，格式 yyyy-MM-dd HH:mm:ss
     *
     * @param hours 小时数， 如果是当前时间之前，则传递负数，如-1，如果是当前时间之后，请传递正数，如1
     * @param date 指定参考日期
     * @author binbin
     * @return String
     */
    @SuppressWarnings("static-access")
    public static String getFullLatestDateTime(int hours, Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(cal.HOUR, hours);

        return format(cal.getTime(), PATTERN_DATETIME);
    }

    /**
     * 
     * getFirstDayOfMonth,(获取本月第一天, 格式为"yyyy-MM-01 00:00:00"). <br/>
     * Author: nifang <br/>
     * Create Date: 2016年4月28日 <br/>
     * ===============================================================<br/>
     * Modifier: nifang <br/>
     * Modify Date: 2016年4月28日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @return 本月第一天
     * @since JDK 1.7
     */
    public static Date getFirstDayOfMonth() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DATE, 1);
        Date firstDayOfMonth = parseDate(calendar.getTime());
        return firstDayOfMonth;
    }

    /**
     * 
     * getFirstDayOfYear,(获取本年第一天, 格式为"yyyy-01-01 00:00:00"). <br/>
     * Author: nifang <br/>
     * Create Date: 2016年4月28日 <br/>
     * ===============================================================<br/>
     * Modifier: nifang <br/>
     * Modify Date: 2016年4月28日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @return 本年第一天
     * @since JDK 1.7
     */
    public static Date getFirstDayOfYear() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.MONTH, 0);
        calendar.set(Calendar.DATE, 1);
        Date firstDayOfYear = parseDate(calendar.getTime());
        return firstDayOfYear;
    }

    /**
     * 
     * parseDate,(将时分秒都有数值的日期格式装换成时分秒都为0的日期格式：yyyy-MM-dd 00:00:00). <br/>
     * Author: nifang <br/>
     * Create Date: 2016年4月29日 <br/>
     * ===============================================================<br/>
     * Modifier: nifang <br/>
     * Modify Date: 2016年4月29日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param date
     * @return 日期, 其中时分秒均为0
     * @since JDK 1.7
     */
    public static Date parseDate(Date date) {
        SimpleDateFormat format = new SimpleDateFormat(PATTERN_DATE);
        String strDate = format.format(date);
        try {
            Date parseDate = format.parse(strDate);
            return parseDate;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 
     * getStrFormatDate,(将时间格式的字符串转为另一种格式). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年4月29日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年4月29日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param time 时间
     * @param curformat 当期时间格式
     * @param format 时间格式
     * @return String 时间
     * @since JDK 1.7
     */
    public static String getStrFormatDate(String time, String curformat, String format) {
        Date date = parseDate(time, curformat);
        String str = "";
        if (date != null) {
            str = format(date, format);
        }
        return str;
    }
    
    /***************************************根据开始结束时间遍历时间start***********************************/
    private static transient int gregorianCutoverYear = 1582;
    
    /** 闰年中每月天数 */
    private static final int[] DAYS_P_MONTH_LY= {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
    /** 非闰年中每月天数 */
    private static final int[] DAYS_P_MONTH_CY= {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
    /** 代表数组里的年、月、日 */
    private static final int Y = 0, M = 1, D = 2;
    
    /**
    * 将代表日期的字符串分割为代表年月日的整形数组
    * @param date
    * @return
    */
    public static int[] splitYMD(String date){
        date = date.replace("-", "");
        int[] ymd = {0, 0, 0};
        ymd[Y] = Integer.parseInt(date.substring(0, 4));
        ymd[M] = Integer.parseInt(date.substring(4, 6));
        ymd[D] = Integer.parseInt(date.substring(6, 8));
        return ymd;
    }
    
    /**
    * 检查传入的参数代表的年份是否为闰年
    * @param year
    * @return
    */
    public static boolean isLeapYear(int year) {
        return year >= gregorianCutoverYear ?
            ((year%4 == 0) && ((year%100 != 0) || (year%400 == 0))) : (year%4 == 0); 
    }
      
    /**
    * 日期加1天
    * @param year
    * @param month
    * @param day
    * @return
    */
    private static int[] addOneDay(int year, int month, int day){
        if(isLeapYear( year )){
            day++;
            if( day > DAYS_P_MONTH_LY[month -1 ] ){
                month++;
                if(month > 12){
                    year++;
                    month = 1;
                }
                day = 1;
            }
        }else{
            day++;
            if( day > DAYS_P_MONTH_CY[month -1 ] ){
                month++;
                if(month > 12){
                    year++;
                    month = 1;
                }
                day = 1;
            }
        }
        int[] ymd = {year, month, day};
        return ymd;
    }
    
    /**
    * 将不足两位的月份或日期补足为两位
    * @param decimal
    * @return
    */
    public static String formatMonthDay(int decimal){
        DecimalFormat df = new DecimalFormat("00");
        return df.format( decimal );
    }
    
    /**
    * 将不足四位的年份补足为四位
    * @param decimal
    * @return
    */
    public static String formatYear(int decimal){
        DecimalFormat df = new DecimalFormat("0000");
        return df.format( decimal );
    }
    
    /**
    * 计算两个日期之间相隔的天数
    * @param begin
    * @param end
    * @return
    * @throws ParseException
    */
    public static long countDay(String begin,String end){
           SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
           Date beginDate , endDate;
           long day = 0;
           try {
            beginDate= format.parse(begin);
            endDate=  format.parse(end);
            day=(endDate.getTime()-beginDate.getTime())/(24*60*60*1000);  
        } catch (ParseException e) {
            e.printStackTrace();
        }                
           return day;
    }
    
    /**
    * 以循环的方式计算日期
    * @param beginDate endDate
    * @param days
    * @return
    */
    public static List<String> getEveryday(String beginDate , String endDate){
        long days = countDay(beginDate, endDate);
        int[] ymd = splitYMD( beginDate );
        List<String> everyDays = new ArrayList<String>();
        everyDays.add(beginDate);
        for(int i = 0; i < days; i++){
            ymd = addOneDay(ymd[Y], ymd[M], ymd[D]);
            everyDays.add(formatYear(ymd[Y])+"-"+formatMonthDay(ymd[M])+"-"+formatMonthDay(ymd[D]));
        }
        return everyDays;
    }
    
    /***************************************根据开始结束时间遍历时间end***********************************/

    /**
     *
     * main,(测试方法). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param args String
     * @since JDK 1.7
     */
    public static void main(String[] args) {

        // 距离今天近几天范围的
        System.out.println(getLatestDateDay(-1)); // 一天前 的日期 ，运行结果：2015-11-17
        // 00:00:00
        System.out.println(getLatestDateDay(2)); // 两天后 的日期 ，运行结果：2015-11-20
        // 00:00:00
        System.out.println(getLatestDateDay(0)); // 当前日期 ，运行结果：2015-11-18
        // 00:00:00

        // 距离现在近几个小时范围的
        System.out.println(getFullLatestDateHour(-1)); // 一小时 前的时间整点
        // ，运行结果：2015-11-18
        // 14:00:00
        System.out.println(getFullLatestDateHour(0)); // 当前时间 的时间整点
        // ，运行结果：2015-11-18
        // 15:00:00
        System.out.println(getFullLatestDateHour(1)); // 一小时后 的时间整点
        // ，运行结果：2015-11-18
        // 16:00:00

        System.out.println(getFullLatestDateTime(-24, new Date()));

        System.out.println(parseDateWithoutTime("2016-04-15"));
        System.out.println(parseStartDateTime("2016-04-15"));
        System.out.println(parseEndDateTime("2016-04-15"));
        System.out.println(getLatestDateYear(0));
        
        List<String> dateStrArray = getEveryday("2016-05-14", "2016-05-15");
        for (String str : dateStrArray) {
            System.out.println("遍历: " + str);
        }
    }

}